iT邦幫忙

0

C 語言-從放棄到入門 CH1 : 執行一個 C 程式

c
  • 分享至 

  • xImage
  •  

如同創世紀,程式的執行也有個開頭。 第一個執行的C程式通常會從main這個入口函數開始(雖然第一個執行的不是main,而是連結器程序指定的入口函數,但初學時不必拘泥於這些細節);避免無聊,我們仿效傳統寫一個在螢幕(console)上輸出"Hello my first c program!"字樣,有個便捷的工具printf可以做到這點,但這個工具的程式碼撰寫於stdio.h檔案中,因此我們必需先將它納入(用include搭配<>符號)才可以使用;最後,作為C語言程序的結尾,我們仿效傳統回傳一個值0來代表整個 main 函數平安的結束。

讓我們看一下對應的程式碼 test.c (以下程式可於colab執行)

#include<stdio.h>

int main();

int main(){
    printf("Hello my first c program!");
    return 0;
}

那test.c這個程式碼要怎麼執行呢? C語言程式碼有點像人類的語言,為了讓電腦讀懂,我們需要透過編譯(compile)轉換為二進位的機器語言檔案,之後才能直接執行這個程式。 gcc 是一個可以執行編譯的工具,我們先用它將 test.c 編譯成二進位檔案,為了方便辨認,我們將輸出的二進位檔另存成(加上-o符號就可以指定新名稱) test.out 的名稱。

# gcc的指令最後,我們加上 test.c 這個想編譯的程式碼
!gcc -o test.out test.c
# 執行二進位程式碼 test.out
!./test.out

# 輸出
>> Hello my first c program!

我們"稍微"深入一點來理解這個程式:

// include關鍵字會將三角形括號內的檔案('stdio.h')中的C程式碼貼在test.c的最上面,這樣程式碼中的工具(函數)就隨我們用了,而不用自己重寫!
# include<stdio.h>

// 函數聲明,函數main沒有接收參數,所以是空括號
// main 函數的返回值是一個整數(int)
int main();

// 實現上面聲明的函數main
int main(){
    // printf函數定義於stdio.h檔案中,所以要先include
    // printf 在這邊接收字串為輸入,這邊我們不接它的返回值
    printf("Hello my first c program!");
    // 如同聲明的那樣,返回整數 0,感覺很 peace!
    return 0;
}
  1. C語言有所謂標準函數庫(standard library),講白了就是一堆C程式碼檔案,這些檔案預先寫好很多實用的功能讓我們不用重複造輪子;例如,stdio.h 就是控制Input/Output的C程式碼,裡面有一個printf函數來協助我們輸出文字到螢幕上;標準函數庫的這些C程式碼檔案放置於某個預設的位置,因此可以用三角形括號代表 "請在預設位置搜尋檔案",如果檔案是放在自己定義的路徑,則用 "/user/path/mylib.h" 來指定搜尋位置,這個例子是我們想搜尋mylib.h檔案,它應該在 /user/path 這個路徑底下。

  2. 這裡科普一下函數(function),它是一個把常用的程式片段包裝成可重複呼叫的程序,函數可以接收一些參數、並輸出一些結果;例如 "把一個數字加二可能是一個常用的功能,我們為這樣的函數取一個名稱" addtwo ,這個函數預計接收一個整數 addtwo(int),然後回傳一個整數 int addtwo(int); 定義完這個函數的外貌,我們就來實現裡面的內容(把數字加二的部分): int addtwo(int num){ return num+2; }; 這樣呼叫 printf( addtwo(1) );,就會在螢幕上看到3了。

  3. 當然函數可以一氣呵成的寫完,不必將定義與內容分開撰寫,但大型程序中,通常會將其區分為函數介面(int addtwo(int);) 與實現(int addtwo(int num){ return num+2; }),實現的部分是 {...} 裡面的程式碼;這樣review大型程式時,可以藉由函數介面快速掌握程式的功能。

  4. 回傳整數是 main 函數的規範之一,你會看到很多教科書的錯誤寫法 void main(){}; 也可以運作正常,但他們會在一些詭異的狀況下造成bug,不如初學時即養成良好的習慣,永遠記住 int main(){return 0;}

  5. 可以看到主程式 main 結尾在 return 0; 語句,但這卻不是必要的(若省略,則編譯器會自動視為回傳0);值得留意的是,程式採用非0值作為異常,例如執行完C程式後,echo $?可以查閱程式的執行結果(exit code)。

恭喜你入門了很難搞的C語言!!
本系列文章的目標也是希望最後讓人對C語言的印象不再是那麼高不可攀,而是有它平易近人的一面 (或許...

預告 CH2 : 資料型態


update log : 2024/11/24 17:24,

  1. 微調用詞、語句。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言